// cf-311b
// 题意：给定n(<=10^5)个山，编号1到n从左到右排成一条直线，并且告诉你相邻
//       两座山的距离di(<10^4)，现在有m(<=10^5)只小猫，每只小猫会去第
//       hi座山玩，然后在ti的时间玩结束，结束之后就在那儿等。现在有
//       p(<=100)个收猫人，他们可以选择任意时间（可以为负）从1号山出发，
//       按顺序一直到n号结束，没走单位距离花单位时间，并且途中不做任何
//       停留，如果到某一座山就把在这座山等的小猫给收走。
//       现在求一个手猫人出发时间的安排，使得所有小猫等的时间和最小，
//       求那个最小时间。
//
// 题解：对于选择第hi山上的小猫，假设从1号山到hi山经过的距离是dis[i]，
//       那么对于ti-dis[i]出发的收猫人，小猫不用等，如果在这之后出发，
//       都会等相应晚出发的时间。那我们可以对于所有小猫，求出对应的
//       ti-dis[hi]，并且将这些数排序。现在相等于p个人要从这些时间挑选
//       出p个时间，把小猫划分成一段一段，某一段小猫都是等它的值之后的
//       最近的收猫人。我们可以很容易的得到一个dp，设f[i][p]表示对于
//       每个小猫计算得到的值，现在做到第i个，用了p个收猫人最小的等待
//       时间和，转移就是：
//         f[i][p] = min{f[k][p] + w[k + 1][i]}, 0<=k<i
//       w[k + 1][i]表示第k+1到i之间的小猫都是等转换后i时刻到达的收猫人
//       的等待时间和
//         w[k + 1][i] = (i - k -1)*a[i] - (sum[i - 1] - sum[k])
//       其中a[i]就是ti-dis[i]排序后的值，sum是a的前缀和。
//       在转移i时，考虑某个j>k，且有
//         f[j][p - 1] + w[j + 1][i] <= f[k][p - 1] + w[k + 1][i]
//       等价变化后，得：
//         f[j][p - 1] + sum[j]  - (f[k][p - 1] + sum[k])
//         ----------------------------------------------- <= a[i]
//                             j - k 
//
//       其中右边a[i]不减，所以这符合一个下凸的斜率优化。
//         Y(i, p) = f[i][p-1] + sum[i]
//         X(i)    = i
//       弄k个单调队列维护就行。注意做p那维的时候倒过来枚举状态，否则
//       可能导致用到之前的i。
//
// run: $exec < bfdiff.in
// opt: 0
// flag: -g
#include <iostream>
#include <algorithm>

int const maxn = 100005;
int const maxp = 107;
long long hill[maxn], tim[maxn];
long long sum[maxn];
long long a[maxn];
int q[maxp][maxn];
int head[maxp], tail[maxp];
long long f[maxn][maxp];
int n, m, p;

long long coord_y(int i, int p) { return f[i][p] + sum[i]; }
long long coord_x(int i) { return i; }
long long slope_y(int i, int j, int p) { return coord_y(i, p) - coord_y(j, p); }
long long slope_x(int i, int j) { return coord_x(i) - coord_x(j); }
bool slope_less(int i1, int j1, int i2, int j2, int p)
{   //                                          | this <= change to < will wa, because of the
	//                                          v zero number, there maybe two same point.
	return slope_y(i1, j1, p) * slope_x(i2, j2) <= slope_y(i2, j2, p) * slope_x(i1, j1);
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> m >> p;
	for (int i = 1; i < n; i++) { std::cin >> sum[i]; sum[i] += sum[i - 1]; }
	for (int i = 0; i < m; i++) {
		std::cin >> hill[i] >> tim[i];
		auto tmp = sum[hill[i] - 1];
		a[i + 1] = tim[i] - tmp;
	}
	std::sort(a + 1, a + m + 1);
	for (int i = 1; i <= m; i++) sum[i] = sum[i - 1] + a[i];
	for (int i = 0; i <= p; i++) head[i] = tail[i] = 1;

	for (int i = 1; i <= m; i++)
		for (int j = p; j >= 1; j--) {
			auto & h = head[j - 1];
			auto & t = tail[j - 1];
			auto & que = q[j - 1];
			while (h < t && slope_y(que[h + 1], que[h], j - 1) <= a[i] * slope_x(que[h + 1], que[h]))
				h++;
			int k = que[h];
			f[i][j] = f[k][j - 1] + (i - k - 1) * a[i] - (sum[i - 1] - sum[k]);
			auto & h1 = head[j];
			auto & t1 = tail[j];
			auto & que2 = q[j];
			while (h1 < t1 && slope_less(i, que2[t1], que2[t1], que2[t1 - 1], j))
				t1--;
			que2[++t1] = i;
		}

	std::cout << f[m][p] << '\n';
}

